/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle;

import classes.BancoDeDados;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import modelo.Cliente;
import modelo.Endereco;
import modelo.Telefone;

/**
 *
 * @author cardodav
 */
public class ClienteDAO {
    
    public Cliente getClienteByCodigo(int codigoPessoa){
        
        Cliente _cRet = null;
        for (Cliente _c : this.getClientes("P.CODIGOPESSOA = " + codigoPessoa)){
            _cRet = _c;
        }
        return _cRet;        
    }
    
    public List<Cliente> getClientes(String criterio){
        
        List<Cliente> _lc = new ArrayList<Cliente>();
        
        BancoDeDados bd = new BancoDeDados();
        
        String query = " SELECT p.codigopessoa, to_char(p.datacadastro,'YYYY-MM-DD') datacadastro, p.email, p.nome, c.cpf, E.ENDERECO, E.CEP, E.ESTADO, to_char(c.datanascimento,'YYYY-MM-DD') datanascimento, c.rg, c.sexo, E.CIDADE " +
                       " FROM pessoa p, cliente c, endereco e " +
                       " WHERE p.codigopessoa = c.codigopessoa AND p.codigopessoa = e.codigopessoa ";
        
        if (criterio != null){        
            query += " and " + criterio;
        }       
        
        ResultSet rs = bd.consultar(query);
        try {
            while (rs.next()){
                Cliente _c = new Cliente();
                _c.setCodigoPessoa(rs.getInt("CODIGOPESSOA"));
                _c.setDataCadastro(rs.getString("DATACADASTRO"));
                _c.setEmail(rs.getString("EMAIL"));
                _c.setNome(rs.getString("NOME"));
                _c.setCpf(rs.getString("CPF"));
                _c.setDataNascimento(rs.getString("DATANASCIMENTO"));
                _c.setRg(rs.getString("RG"));
                _c.setSexo(rs.getString("SEXO"));

                Endereco _e = new Endereco();
                _e.setCep(rs.getString("CEP"));
                _e.setCidade(rs.getString("CIDADE"));
                _e.setEndereco(rs.getString("ENDERECO"));
                _e.setEstado(rs.getString("ESTADO"));
                                
                _c.setEndereco(_e);               
                
                
                //pega os telefones
                String queryTelefone = " SELECT t.ddd, t.numero, t.codigotelefone, t.operadora, t.tipo, t.codigopessoa " +
                       " FROM telefone t " +
                       " WHERE t.codigopessoa = " + _c.getCodigoPessoa();
                
                ResultSet rsT = bd.consultar(queryTelefone);
                List<Telefone> _lt = new ArrayList<Telefone>();
                while (rsT.next()){
                
                    Telefone _t = new Telefone();
                    _t.setNumero(rsT.getString("numero"));
                    _t.setTipo(rsT.getString("tipo"));                    
                    _lt.add(_t);
                }   
                _c.setTelefone(_lt);
                
                //retorna o cliente
                _lc.add(_c);
                
            }
        } catch (SQLException ex) {
            System.out.println("Erro ao retornar o cliente: " + ex.getMessage());
        }        
        
        bd.desconectar();
    
        return _lc;
    }  
    
    public boolean salvarCliente(Cliente _c){
        
        boolean ret = false;
        
        BancoDeDados bd = new BancoDeDados();
        if (_c.getCodigoPessoa() == 0){
            
            _c.setCodigoPessoa(PessoaDAO.getCodigoProximo());
            
            //insere a pessoa
            try{
                
                String query = "insert into pessoa  (codigopessoa, datacadastro, email, nome ) values (" +
                        _c.getCodigoPessoa() + ", sysdate, '" + _c.getEmail() + "','" + _c.getNome() + "')";  
                
                int retPessoa = bd.executarDML(query);
                if(retPessoa == 0){
                    throw new Exception("Erro na query insert: " + _c.getNome());
                } else {
                    ret = true;
                }
            }
            catch(Exception ex){
                System.out.println("Erro ao inserir a pessoa: " + ex.getMessage());
            }      
            
            
            //insere o cliente
            try{
                String query = "insert into cliente  (codigopessoa, sexo, datanascimento, rg, cpf ) values (" +
                        _c.getCodigoPessoa() + ", null, to_date('" + _c.getDataNascimento() + "','YYYY-MM-DD'),'" + _c.getRg() + "','" + _c.getCpf() + "')";  
                
                int retCliente = bd.executarDML(query);
                if(retCliente == 0){
                    throw new Exception("Erro na query insert: " + _c.getNome());
                } else {
                    ret = true;
                }
            }
            catch(Exception ex){
                System.out.println("Erro ao inserir o novo cliente: " + ex.getMessage());
            }  
            
            //insere o endereco da pessoa
            try{            
                Endereco _e = _c.getEndereco();
                String query = "insert into endereco (estado, cep, codigoendereco, endereco, codigopessoa, cidade) values (" +
                        "'" + _e.getEstado() + "','" + _e.getCEP() + "'," + _e.getCodigoEndereco() + ",'" + _e.getEndereco() + "'," +
                               _c.getCodigoPessoa() + ",'" + _e.getCidade() + "')";
                
                int retEndereco = bd.executarDML(query);
                if(retEndereco == 0){
                    throw new Exception("Erro na query insert: " + _c.getNome());
                } else {
                    ret = true;
                }                               
            } catch (Exception ex){
                System.out.println("Erro ao inserir o endereço: " + ex.getMessage());
            }
            
            //insere os telefones da pessoa
            try{            
                List<Telefone> _lt = _c.getTelefone();
                
                for (Telefone _t : _lt){
                    String query = "insert into telefone (ddd, numero, codigotelefone, operadora, tipo, codigopessoa) values (" +
                            "null,'" + _t.getNumero() + "'," + _t.getCodigoTelefone() + ",null," +
                                   "'" + _t.getTipo() + "'," + _c.getCodigoPessoa() + ")";

                    int retTelefone = bd.executarDML(query);
                    if(retTelefone == 0){
                        throw new Exception("Erro na query insert: " + _c.getNome());
                    } else {
                        ret = true;
                    }                               
                }
            } catch (Exception ex){
                System.out.println("Erro ao inserir o telefone: " + ex.getMessage());
            }
            
            if (ret){
                JOptionPane.showMessageDialog(null, "Cliente incluído com sucesso.");
            } else {
                JOptionPane.showMessageDialog(null, "Erro ao inserir o cliente.");
            }            
            
        } else {
        
            try {
                String query = "update pessoa set " + 
                        " nome = '" + _c.getNome() + "'," +
                        " email = '" + _c.getEmail() + "' " +
                        " where codigopessoa = " + _c.getCodigoPessoa();
                int retUPessoa = bd.executarDML(query);
                if (retUPessoa != 0){
                    ret = true;                
                }             
            } catch (Exception ex){
                System.out.println("erro ao atualizar a pessoa. " + ex.getMessage());
            }
       
            
            try {
                String query = "update cliente set " + 
                        " cpf = '" + _c.getCpf() + "'," +
                        " rg = '" + _c.getRg() + "', " +
                        " datanascimento = to_date('" + _c.getDataNascimento() + "','YYYY-MM-DD') " +
                        " where codigopessoa = " + _c.getCodigoPessoa();
                int retUCliente = bd.executarDML(query);
                if (retUCliente != 0){
                    ret = true;                
                }             
            } catch (Exception ex){
                System.out.println("erro ao atualizar o cliente. " + ex.getMessage());
            }                 
            
            try {
                String query = "update endereco set " + 
                        " estado = '" + _c.getEndereco().getEstado() + "'," +
                        " cep = '" + _c.getEndereco().getCEP() + "', " +
                        " codigopessoa = " + _c.getCodigoPessoa() + ", " +
                        " endereco = '" + _c.getEndereco().getEndereco() + "', " +
                        " cidade = '" + _c.getEndereco().getCidade() + "' " +
                        " where codigopessoa = " + _c.getCodigoPessoa();
                int retUCliente = bd.executarDML(query);
                if (retUCliente != 0){
                    ret = true;                
                }             
            } catch (Exception ex){
                System.out.println("erro ao atualizar o endereco. " + ex.getMessage());
            }        
            

            //insere os telefones da pessoa
            try{            
                
                bd.executarDML("delete from telefone where codigopessoa = " + _c.getCodigoPessoa());
                
                List<Telefone> _lt = _c.getTelefone();
                
                for (Telefone _t : _lt){
                    String query = "insert into telefone (ddd, numero, codigotelefone, operadora, tipo, codigopessoa) values (" +
                            "null,'" + _t.getNumero() + "'," + TelefoneDAO.getCodigoProximo() + ",null," +
                                   "'" + _t.getTipo() + "'," + _c.getCodigoPessoa() + ")";

                    int retTelefone = bd.executarDML(query);
                    if(retTelefone == 0){
                        throw new Exception("Erro na query insert: " + _c.getNome());
                    } else {
                        ret = true;
                    }                               
                }
            } catch (Exception ex){
                System.out.println("Erro ao inserir o telefone: " + ex.getMessage());
            }
            
            if (ret){
                JOptionPane.showMessageDialog(null, "Cliente incluído com sucesso.");
            } else {
                JOptionPane.showMessageDialog(null, "Erro ao inserir o cliente.");
            }              
            
        }
        
        return ret;

    }
}
